YS電子工作ラボ 
第96回PICクラブ 情報交換会 (開催日 2024.09.21)
<紹介作品

picoWによる
   スマホ式WiFi_STAモード型リモコン付
              PWMメロディ発生器
以下、 第96回PIC情報交換会報告(後閑さん、FaceBook Picfun.club.より)  
  ■ 講評 後閑さん 
 
スマホとラズパイPicoによるメロディ発生器 : 斎藤さん
 ラズパイPicoをWebサーバとして構成し、スマホからWi-Fi経由でコントロールできるメロディ発生器の紹介でした。3曲のメロディからスマホで選択した曲をPicoで再生し、それをイメージした画像をスマホに表示していました。
 
   
以下、紹介に際し使用した資料  
  2024.09.21 PIC情報交換会資料 
YS電子工作デザイン http://www.ys-labo.com/  斎藤
YS電子工作ショップ http://ys-labo.shop-pro.jp/
  1. 概要
  1-1 要約
・ pico WのポートをPWMモードで使用した時に発生する音の周波数、出力時間を変化させて、メロディを発生したものです。
・ メロディは 唱歌「ふるさと」、「鉄道唱歌」、「赤とんぼ」です。
・ メロディの進捗に同期して、スマホ(Android Chrome)画面上のプログレスバー、歌詞、画像が変化します。
・ 曲の途中でメロディーを 一時停止/再開、スキップできる押しボタンスイッチ付きです。
・ 曲の途中でのメロディーの 一時停止/再開、スキップはpico WのWiFi機能を使ってスマホ画面からタッチ操作でもできます。
・ WiFiはインターネットに接続したモバイル型ルータをDHCPサーバー 及び中継器として またスマホをpico WのクライアントとしたSTA(Station)モードで WiFi通信制御を行っています。
・ 付随機能として時刻表示、NHKウェブニュース閲覧、入力電圧表示などがあります。
  1-2 システム構成(→ PDF
  2. 外観 
   
 
  3. 開発環境
 ・ Arduino IDE ver.2.3.2、 
    Library manager: ESP8266Audio /Board manager: Raspberry Pi Pico/RP2040 by Earle Philhower
 ・ CPU/Device: RP2040/Pico W
  4. 動作結果
   ・  動画  (1080pのHD動画)  
 ・ 各メロディの画面モード
メロディ
題名 
画面モード 
モード1 モード2 モード3 モード4
ふるさと
鉄道唱歌
赤とんぼ - -

  5. 設計参考
  プログラム
5.1 全体構成
 
  
#include <WiFi.h>        
#include <WiFiClient.h>  
#include <WebServer.h>   
#include <app.h>
 ……

//Android ブラウザ画面 表示 StreamString html = //StreamStringクラス R"( //RプレフィックスによるHTMLなどの文字列リテラル化 ********************************************************************************************************************* * <!DOCTYPE html> //以下、HTML、CSS、JavaScriptによる記述   * * <html lang="ja"> * *   …… * * <script> * * …… * * async function updateOutput(){ //Aruduino言語からデータ取得、outputタグの表示更新 * * const output = document.getElementById("output"); * * try { * * const response = await fetch("/get/mode"); * * if (response.ok)output.textContent = await response.text(); * * else { throw new Error(); } * * } catch (error) { console.log(error); } * * } * * …… * * setInterval('ShowPage()', 100); //表示、100[msec]毎に更新 * * </script> * *            * * <button type="button" class="buttonA" onclick="location.href=' /myTouch'">Play/Pause</button> //<button>タグ * * * *      …… * * </html> //以上、 HTML、CSS、JavaScriptによる記述 * ********************************************************************************************************************* )"; // サーバーリクエスト時処理関数 void handleRoot() { server.send(200, "text/html", html); //レスポンス200を返し、htmlデータ送信 //server.send (レスポンスコード, "データ形式", 送信データ); } void TouchAndroid(){ //Android 画面 演奏/一時停止タッチ操作処理 if(PlayMode == 0)PlayMode = 1; else PlayMode = 0; handleRoot(); } // ブラウザ表示更新:PlayMode //演奏/一時停止 他 void getMode(){ int SendData; char buf[32]; AdValue12 = analogRead(VOLUME_PIN); //可変抵抗器AD値を読み出し SendData = PlayMode * 1000000 //100万倍 ////PlayMode、ix、AdValue12データを加算した送信データを作成 + ix * 10000 //1万倍 + AdValue12; sprintf(buf, "%d", SendData); // dataの値を文字列として格納 server.send(200, "text/html", buf); // レスポンス200を返し、dataを文字列で送信 } …… void setup(void) { server.on("/", handleRoot);//サーバー設定 //server.on(URIアドレス、関数名) //URIにアクセスがあった時に呼び出す関数を登録 server.on("/myTouch",TouchAndroid); //Android画面 Play/Pauseボタン操作 受信処理 server.on("/get/mode", getMode); // データ表示更新受信処理 …… } void loop(void) { server.handleClient(); //登録した情報に従ってクライアントからのリクエストを処理する関数 …… }
 
 5.2  画像の表示方法
    Web上のjpg画像(http://www.ys-labo.com/pc/2024/6/PictureData1/PictureData%201.html)
を メロディの進捗に合わせてJava Scriptで表示
 
<html lang="ja">
<script>
   function ShowSongWords(){   //曲名・歌詞 切り替え   
      let MelodyTitle;
      let msg0;
      let msg2;      

      let elem = document.getElementById("SlideShow");
      msg0 = document.getElementById('output2').textContent; //文字列データ

      //ふるさと
      if(msg0 == "Usagi"){
        MelodyTitle = "唱歌: ふるさと";
        MelodytitleNum = 0;
        msg2 = "兎追いし彼の山";
        elem.src = "http://www.ys-labo.com/pc/2024/6/PictureData1/_YamaKawaUsagi_401x201.jpg";
      }
      else if(msg0 == "Kobuna")
      {
        MelodyTitle = "唱歌: ふるさと";
        MelodytitleNum = 0;
        msg2 = "小鮒釣りし彼の川";
        elem.src = "http://www.ys-labo.com/pc/2024/6/PictureData1/_SpringRiver_400x240.jpg";
      }
	  ……	
      document.getElementById("TitleAreaId").innerHTML = MelodyTitle;
      document.getElementById("SongWordsAreaId").innerHTML = msg2;
    }

    function ShowPage(){   //ブラウザのページを表示
      ……
      ShowSongWords();  //歌詞、画像の表示
    }
  
    setInterval('ShowPage()', 100);    //表示、100[msec]毎に更新
</script>

<body>

    <h1 id="TitleAreaId">&emsp;<b></b></h1>
    <h2 id="SongWordsAreaId">&emsp;<b></b></h2>
    
    <img id = "SlideShow" src = "http://www.ys-labo.com/pc/2024/6/PictureData1/YamaKawaUsagi_401x201.jpg"; height=240 vspace="5">
 </body>
    
 
5.3 ソースコード
   app.ino  app.h
(上記ファイルは、エンコーディングが unicode + UTF-8で記載されています。 ご使用になっているブラウザのエディタによってはshift-JISでファイルが開かれるため文字化けが発生することがあります。 この場合ファイルを保存後、エクスプローラからファイルのエンコーディング判別が可能なエディタ(秀丸エディタなど)でファイルを開く方法があります。)

以下、app.ino 全文




以下、app.h 全文

  6. 備考
6.1 WiFi関係
   ・ 参考とさせてもらったURL:  ・Earle Philhower  ・HomemadeGarbage  ・LogikaraBlog 他
   ・ その他技術資料: Arduino IDE example sketch: pico W用、Arduino uno R4 WiFi 用 他

6.2 実験に使用したモバイルWiFiルータ :Macaroon FREEBOT SE01

6.3 YS電子工作ラボHP での紹介 → URL